﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Routing;
using System.Globalization;
using System.Web.Mvc.Html;

namespace rusisControls.MVC.Controls.rusisGrid
{
    public static class rusisGridSearchBoxHelper
    {
        public static MvcHtmlString rsGridSearchBox(this HtmlHelper helper, string actionName, string controllerName, int countColumns, RouteValueDictionary fields, RouteValueDictionary hiddenFields)
        {
            var urlHelper = new UrlHelper(helper.ViewContext.Controller.ControllerContext.RequestContext);

            StringBuilder builder = new StringBuilder();

            builder.AppendLine("<script>");
            builder.AppendLine("    $(document).keypress(function(event) {");
            builder.AppendLine("        var keycode = (event.keyCode ? event.keyCode : event.which);");
            builder.AppendLine("        if (keycode == '13') {");
            builder.AppendLine("            $('#btnSearch').click();");
            builder.AppendLine("        }");
            builder.AppendLine("    });");
            builder.AppendLine("</script>");

            //string url = (helper.ViewContext.HttpContext.Request).RawUrl;
            builder.AppendLine("<form action=\"" + urlHelper.Action(actionName, controllerName) + "\" id=\"searchFrom\" method=\"get\">");
            //builder.AppendLine("<form action=\"" + url + "\" id=\"searchFrom\" method=\"get\">");
            builder.AppendLine("    <tr>");

            int colNum = 0;
            foreach (var field in fields)
            {
                colNum++;
                if (colNum <= countColumns)
                {
                    string style = "style=\"width:100px;\"";
                    if (colNum == 1)
                        style = "style=\"width:30px;\"";

                    builder.AppendLine("        <th style=\"white-space:nowrap;\">");

                    if ((field.Value != null) && (field.Value.GetType() == typeof(DateTime))) // Если столбец - дата
                    {
                        DateTime? value = null;
                        if ((DateTime)field.Value == DateTime.MinValue) // Значение сделать равным - null
                            value = null;
                        else // Контролу присвоить значение из field.Value
                            value = (DateTime)field.Value;

                        // Отрисовка контрола DatePicker
                        DateTimeFormatInfo dateTimeFormat = null;
                        CultureInfo cultureInfo = new CultureInfo("ru-RU");
                        //string dateFormatString = (dateTimeFormat ?? Thread.CurrentThread.CurrentCulture.DateTimeFormat).ShortDatePattern;
                        string dateFormatString = (dateTimeFormat ?? cultureInfo.DateTimeFormat).ShortDatePattern;
                        string dateFormatStringJQ = rusisDatePickerHelper.ConvertDateFormat(helper, dateFormatString);

                        builder.AppendLine(
                            "<script type='text/javascript'> " +
                                    " $(function () { " +
                                        " $.datepicker.setDefaults($.extend( " +
                                        "	    $.datepicker.regional[\"ru\"]) " +
                                        "	  ); " +
                                        " $('#" + field.Key + "').datepicker({ " +
                                            " dateFormat: '" + dateFormatStringJQ + "', " +
                                            " showOn: 'button', " +
                                            " buttonImage: '" + urlHelper.Content("~/Content/Images/calendar.gif") + "', " +
                                            " buttonImageOnly: true, " +
                                            " onSelect: function(dateText, inst) { " +
                                            "	      $('#btnSearch').click();" +
                                            " } " +
                                        " }); " +
                                    " }); " +
                                    " </script> " +
                                    "<input type='text' " + style + " id='" + field.Key + "' name='" + field.Key + "' " +
                                        " value = '" + ((value.HasValue) ? value.Value.ToString(dateFormatString) : "") + "'" +
                                    " />");
                    }
                    else // Если столбец - не дата
                        builder.AppendLine("            <input id=\"" + field.Key + "\" name=\"" + field.Key + "\" value=\"" + field.Value + "\" " + style + " type=\"text\" />");

                    if (colNum == 1) // Если первый столбец, то вставляется в него скрытая кнопка SUBMIT
                    {
                        // Добавляется скрытая кнопка submit
                        builder.AppendLine("            <span style=\"visibility:hidden;width:0px;height:0px;\"><input type=\"submit\" style=\"width:0px;height:0px;\" id=\"btnSearch\" /></span>");

                        // Добавляются вспомогательные скрытые поля для запомниания get-параметров исходной формы
                        foreach (var hField in hiddenFields)
                            builder.AppendLine("            <input id=\"" + hField.Key + "\" name=\"" + hField.Key + "\" value=\"" + hField.Value + "\" type=\"hidden\" />");
                    }

                    builder.AppendLine("        </th>");
                }
            }

            // Дополняем пустыми столбцами если полей фильтра оказалось меньше, чем столбцов в исходном гриде, в который вставляется строка фильтров
            while (colNum < countColumns)
            {
                builder.AppendLine("        <th></th>");
                colNum++;
            }

            builder.AppendLine("    </tr>");
            builder.AppendLine("</form>");

            return new MvcHtmlString(builder.ToString());
        }
    }
}
